<?php

/**
*Clase que manipula los precios
*
*Esta clase informa acerca del precio que debe pagar un cliente segun un historial de precios
*
*@author gush
*@author pegudo
*@package controller
*/

Class HistorialpreciosController extends AppController {
	var $name = 'Historialprecios';
	
	/**
	 * Funcion que setea los precios cerrados y sugiere los precios no cerrados
	 * @return 
	 * @param $iIdCliente integer
	 */
	function index($iIdCliente=null){
		
		if($iIdCliente==null){
			//manda a guardar
			$mes_index = $this->data['Historialprecio']['mes_index'];
			$sMesIndex = "precio_$mes_index";
			$iIdCliente = $this->data['Historialprecio']['idCliente'];
			$fecha = $this->data['Historialprecio']['fecha'];
			$precio = $this->data['Historialprecio']["$sMesIndex"];
			$cantidad = $this->data['Historialprecio']['cantidad'];
			$this->data = "";
			$this->cerrarMes($iIdCliente,$fecha,$precio,$cantidad);
		}
		
		//fecha actual
		$hoy = date('d-m-Y');
		$hoy = $this->ultimoDia($hoy);

		//obtenemos los meses cerrados
		$fields = array('fecha','precio');
		$conditions = array('id_cliente'=>"$iIdCliente");
		$order = "fecha asc";
		$aMeses = $this->Historialprecio->findAll($conditions,$fields,$order);
		
		//obtener las cantidades de cajas custodiadas y el precio sugerido para cerrar el mes (desde el ultimo mes cerrado hasta la fecha actual)

		//calculamos los meses que deben cerrarse --------------------------------------------------------
		$iCantMeses = sizeof($aMeses);
		if($iCantMeses==0){
			//no tiene meses cerrados
			$ultimoMesCerrado = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente");
			
			//coloco la ultima fecha de mes cerrado como el inicio de contrato
			$fecha = explode('-',$ultimoMesCerrado);
			$mes 	= $fecha[1];
			$anio 	= $fecha[0];
			
			//coloco el mes anterior al inicio de contrato
			if($mes==01){
				$mes = 12;
				$anio --;
			}
			else	
				$mes --;

			$ultimoMesCerrado = "$anio-$mes-01";
			$restar = 1;
		}
		else{//tiene meses cerrados
			$restar = 0;
			$ultimoMesCerrado = $aMeses[$iCantMeses-1]['Historialprecio']['fecha'];
		}
		
		$dias_diferencia = $this->diferenciaDias($hoy, $ultimoMesCerrado);

		$iCantMeses = abs(round($dias_diferencia / 30));//cantidad de meses que deben cerrarse
		$iCantMeses -= $restar;//no resta nada si tiene meses cerrados, sino resta uno
		
		//si los meses que faltan cerrar no son cero
		if($iCantMeses != 0){
			//crea un arreglo con las fechas de los meses no cerrados
			$mesAnterior = $this->agregarMes($ultimoMesCerrado);
			$mesAnterior = $this->ultimoDia($this->convertDmyToYmd($mesAnterior));
			$aMesesNoCerrados[0]['Historialprecio']['fecha'] = $mesAnterior; 
			for($i=1;$i<$iCantMeses;$i++){
				//fecha
				$mesAnterior = $aMesesNoCerrados[$i-1]['Historialprecio']['fecha'];
				$mesAnterior = $this->agregarMes($mesAnterior);
				$aMesesNoCerrados[$i]['Historialprecio']['fecha'] = $this->ultimoDia($this->convertDmyToYmd($mesAnterior));
			}
			
			
			
			//se obtiene cuantas cajas custodiadas hay por c/u de esos meses -----------
			$dFechaDesde = $ultimoMesCerrado;
			$dFechaDesde =  $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente");
			for($i=0;$i<$iCantMeses;$i++){
				//cantidad cajas
				$dFechaHasta = $aMesesNoCerrados[$i]['Historialprecio']['fecha'];
				$prest = $this->requestAction("prestacions/getCantCajasCustodiadas/$iIdCliente/$dFechaDesde/$dFechaHasta/");
				//echo "desde $dFechaDesde -> $dFechaHasta <br />";
				//pr($prest);
				$iCajas = $prest['altas'] - $prest['bajas'];
				$aMesesNoCerrados[$i]['Historialprecio']['cantidad'] = $iCajas;
				
				//precio sugerido
				$fPrecio = $this->requestAction("listaprecios/getPrecio/$iIdCliente/$iCajas/");
				$aMesesNoCerrados[$i]['Historialprecio']['precio'] = $fPrecio;
				//$dFechaDesde = $dFechaHasta;
			}
		}
		else
			$aMesesNoCerrados = null;

		//seteo los resultados	
		$this->set('aMesesCerrados',$aMeses);
		$this->set('aMesesNoCerrados',$aMesesNoCerrados);
		$this->set('idCliente',$iIdCliente);
	}
	
	////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 *Funcion que devuelve true si tiene todos los meses cerrados para facturar  
	 * @return boolean
	 * @var fecha date "Y-m-d"
	*/
	function mesCerrado($idCliente,$fecha){
		//convierte la fecha en la fecha del ultimo dia de ese mes
		//$fecha = $this->convertDmyToYmd($fecha);
		$fecha = $this->ultimoDia($fecha);

		//consulta si esta esa fecha
		$conditions = array('fecha'=>"$fecha",'id_cliente'=>"$idCliente");
		$precio = $this->Historialprecio->findAll($conditions);
		
		if(isset($precio['0'])){
			return true;
		}
		else
			return false;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * Funcion asigna un precio a las cajas custodiadas a un mes especifico y un cliente especifico
	 * @return 
	 * @param $idCliente integer
	 * @param $fecha date "Y-m-d"
	 * @param $precio float
	 */
	function cerrarMes($iIdCliente,$fecha,$precio,$cantidad){

		//inserta el registro
		$insert_query = "insert into historialprecios (`fecha`,`precio`,`id_cliente`) values ('$fecha',$precio,$iIdCliente)";
		$this->Historialprecio->execute($insert_query);
		
		//agrega una prestacion en el mes siguiente con la cantidad de cajas con el mes cerrado
		$dFechaInicio = explode('-',$fecha);
		$anio = $dFechaInicio[0];
		$mes = $dFechaInicio[1];
		$dia = 1;
		
		if($mes==12){
			$mes = 1;
			$anio ++;
		}
		else
			$mes ++;
		
		$dFechaInicio = "$anio-$mes-0$dia";
		$dFechaFin = $this->ultimoDia($dFechaInicio);

		$insert_query = "insert into prestacions (`id` ,`precio` ,`fecha_inicio` ,`fecha_fin` ,`cantidad` ,`clientes_id` ,`servicios_id`) values";
		$insert_query .= "('',0,'$dFechaInicio','$dFechaFin',$cantidad,$iIdCliente,2)";

		$this->Historialprecio->execute($insert_query);
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	
	/**
	 * Funcion que devuelve el precio de las custodias para un mes especifico
	 * @return 
	 * @param $idCliente integer
	 * @param $fecha date "Y-m-d"
	 * @param $precio float
	 */
	function getPrecio($idCliente,$fecha){
		//convierte la fecha en la fecha del ultimo dia de ese mes
		//$fecha = $this->convertDmyToYmd($fecha);
		$fecha = $this->ultimoDia($fecha);

		//consulta si esta esa fecha
		$conditions = array('fecha'=>"$fecha",'id_cliente'=>"$idCliente");
		$precio = $this->Historialprecio->findAll($conditions);
		if(isset($precio[0]['Historialprecio']['precio']))
			$precio = $precio[0]['Historialprecio']['precio'];
		else
			$precio = null;
		return $precio;
	}

	function getUltimoMesCerrado($iIdCliente){
		//obtenemos los meses cerrados
		$fields = array('fecha','precio');
		$conditions = array('id_cliente'=>"$iIdCliente");
		$order = "fecha asc";
		$aMeses = $this->Historialprecio->findAll($conditions,$fields,$order);
		$iCantMeses = sizeof($aMeses);
		if($iCantMeses==0){
			//$dFechaContratoIni = $this->requestAction("clientes/getFechaInicioContrato/$iIdCliente/");
			//return $dFechaContratoIni;
			return null;
		}
		else{
			$ultimoMesCerrado = $aMeses[$iCantMeses-1]['Historialprecio']['fecha'];
			return $ultimoMesCerrado;
		}
	}
	
	function getMesesCerrados($iIdCliente){
		$fields = array('fecha');
		$conditions = array('id_cliente'=>"$iIdCliente");
		$order = "fecha asc";
		$aMeses = $this->Historialprecio->findAll($conditions,$fields,$order);
		$iCantMeses = sizeof($aMeses);
		if($iCantMeses==0){
			//no existe meses cerrados
			return 0;
		}
		else{
			return $aMeses;
		}
	}
}
?>
